package dao;

import java.util.List;

import hibernate.HibernateUtil;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;

import entity.Administracion.Entity_DestinoInternacional;
import entity.Administracion.Entity_DestinoNacional;
import entity.Administracion.Entity_Empleado;
import entity.Administracion.Entity_Pais;
import entity.Administracion.Entity_Provincia;
import entity.Administracion.Entity_Rol;
import entity.Administracion.Entity_Stock;
import entity.Administracion.Entity_Sucursal;
import entity.Administracion.Entity_Usuario;


public class AdministracionDAO {
	private static AdministracionDAO instancia;
	private static SessionFactory sf = null;

	private AdministracionDAO() {
		sf = HibernateUtil.getSessionFactory();
    }
	
	
	public static AdministracionDAO getInstancia(){
		if(instancia == null){
			instancia = new AdministracionDAO();
		} 
		return instancia;
	}
	
	
	/**Empleados**/
	public void altaEmpleado(Entity_Empleado empleado) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(empleado); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error AdministracionDAO. Alta empleado");
	        }
	}
	public void modificarEmpleado(Entity_Empleado empleado) {
		try {
        	Session session=sf.openSession();
            session.beginTransaction();
            session.update(empleado); 
            session.getTransaction().commit();
            session.close();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Modificar empleado");
        }
	}
	public void bajaEmpleado(Entity_Empleado empleado) {
		try {
			 Session session=sf.getCurrentSession();
             session.beginTransaction();
             session.delete(empleado);
             session.flush();
             session.getTransaction().commit();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Eliminar empleado");
        }
	}
	public Entity_Empleado getEmpleado(Integer idEmpleado) {
		try {
        	Session session=sf.openSession();
            session.beginTransaction();
            Entity_Empleado empleado = (Entity_Empleado) session.get(Entity_Empleado.class, idEmpleado);
            session.getTransaction().commit();
            session.close();
            return empleado;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Get empleado");
        }
        return null;
	}
	
	/**Sucursal**/
	public void altaSucursal(Entity_Sucursal sucursal) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(sucursal); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error AdministracionDAO. Alta Sucursal");
	        }
	}
	public void  modificarSucursal(Entity_Sucursal sucursal) {
		try {
       	Session session=sf.openSession();
           session.beginTransaction();
           session.update(sucursal); 
           session.getTransaction().commit();
           session.close();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Modificar Sucursal");
       }
	}
	public void bajaSucursal(Entity_Sucursal sucursal) {
		try {
			 Session session=sf.getCurrentSession();
            session.beginTransaction();
            session.delete(sucursal);
            session.flush();
            session.getTransaction().commit();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Eliminar Sucursal");
       }
	}
	public Entity_Sucursal getSucursal(Integer idSucursal) {
		try {
       	Session session=sf.openSession();
           session.beginTransaction();
           Entity_Sucursal sucursal = (Entity_Sucursal) session.get(Entity_Sucursal.class, idSucursal);
           session.getTransaction().commit();
           session.close();
           return sucursal;
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Get Sucursal");
       }
       return null;
	}
	
	
	/**Stock**/
	public void altaStock(Entity_Stock stock) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(stock); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error AdministracionDAO. Alta Stock");
	        }
	}
	public void modificarStock(Entity_Stock stock) {
		try {
        	Session session=sf.openSession();
            session.beginTransaction();
            session.update(stock); 
            session.getTransaction().commit();
            session.close();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Modificar Stock");
        }
	}
	public void bajaStock(Entity_Stock stock) {
		try {
			 Session session=sf.getCurrentSession();
             session.beginTransaction();
             session.delete(stock);
             session.flush();
             session.getTransaction().commit();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Eliminar Stock");
        }
	}
	public Entity_Stock getStock(Integer idStock) {
		try {
        	Session session=sf.openSession();
            session.beginTransaction();
            Entity_Stock stock = (Entity_Stock) session.get(Entity_Stock.class, idStock);
            session.getTransaction().commit();
            session.close();
            return stock;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Get Stock");
        }
        return null;
	}
	
	
	/**Destino**/
	//Nacional
	public void altaDestinoNacional(Entity_DestinoNacional destino) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(destino); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error AdministracionDAO. Alta Destino Nacional");
	        }
	}
	public void modificarDestinoNacional(Entity_DestinoNacional destino) {
		try {
       	Session session=sf.openSession();
           session.beginTransaction();
           session.update(destino); 
           session.getTransaction().commit();
           session.close();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Modificar Destino Nacional");
       }
	}
	public void bajaDestinoNacional(Entity_DestinoNacional destino) {
		try {
			 Session session=sf.getCurrentSession();
            session.beginTransaction();
            session.delete(destino);
            session.flush();
            session.getTransaction().commit();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Eliminar Destino Nacional");
       }
	}
	public Entity_DestinoNacional getDestinoNacional(Integer idDestino) {
		try {
       	Session session=sf.openSession();
           session.beginTransaction();
           Entity_DestinoNacional destino = (Entity_DestinoNacional) session.get(Entity_DestinoNacional.class, idDestino);
           session.getTransaction().commit();
           session.close();
           return destino;
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error AdministracionDAO. Get Destino Nacional");
       }
       return null;
	}
	//Internacional
	public void altaDestinoInternacional(Entity_DestinoInternacional destino) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(destino); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error AdministracionDAO. Alta Destino Internacional");
	        }
	}
	public void modificarDestinoInternacional(Entity_DestinoInternacional destino) {
		try {
      	Session session=sf.openSession();
          session.beginTransaction();
          session.update(destino); 
          session.getTransaction().commit();
          session.close();
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error AdministracionDAO. Modificar Destino Internacional");
      }
	}
	public void bajaDestinoInternacional(Entity_DestinoInternacional destino) {
		try {
			 Session session=sf.getCurrentSession();
           session.beginTransaction();
           session.delete(destino);
           session.flush();
           session.getTransaction().commit();
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error AdministracionDAO. Eliminar Destino Internacional");
      }
	}
	public Entity_DestinoInternacional getDestinoInternacional(Integer idDestino) {
		try {
      	Session session=sf.openSession();
          session.beginTransaction();
          Entity_DestinoInternacional destino = (Entity_DestinoInternacional) session.get(Entity_DestinoInternacional.class, idDestino);
          session.getTransaction().commit();
          session.close();
          return destino;
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error AdministracionDAO. Get Destino Internacional");
      }
      return null;
	}
	
	/**Usuario**/
	public void altaUsuario(Entity_Usuario usuario){
        try {
        	Session session=sf.openSession();
            session.beginTransaction();
            session.persist(usuario); 
            session.getTransaction().commit();
            session.close();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Alta usuario");
        }
	}
	public void bajaUsuario(Entity_Usuario usuario) {
		try {
			 Session session=sf.getCurrentSession();
           session.beginTransaction();
           session.delete(usuario);
           session.flush();
           session.getTransaction().commit();
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error AdministracionDAO. Eliminar usuario");
      }
	}
	public Entity_Usuario buscarUsuario(String usuario){
        try{
        	Session session = sf.openSession();
        	Entity_Usuario u = (Entity_Usuario) session.createQuery("from Entity_Usuario u where u.usuario = :usuario").setParameter("usuario", usuario).uniqueResult();
    		session.close();
            return u;
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Buscar Usuario");
        }
        return null;
	}
	
	public void actualizarUsuario(Entity_Usuario usuario){
        try{
        	Session session = sf.openSession();
        	session.beginTransaction();
        	session.update(usuario);
        	session.getTransaction().commit();
        	session.close();
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Actualizar Usuario");
        }
	}
	@SuppressWarnings("unchecked")
	public List<Entity_Rol> buscarRolesUsuario(String usuario){
        try {
        	Session session=sf.openSession();
            session.beginTransaction();
            List<Entity_Rol> rol = session.createQuery("select r from Entity_Usuario u join u.roles r where u.usuario=:usuario ").setParameter("usuario", usuario).list();
            session.getTransaction().commit();
            session.close();
            return rol;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Buscar Roles Usuarios");
        }
        return null;
	}
	
	/**Listados**/
	//Pais
	@SuppressWarnings("unchecked")
	public List<Entity_Pais> listarPaises(){
        try{
        	Session session = sf.openSession();
        	List<Entity_Pais> lista = session.createQuery("from Entity_Pais").list();
    		session.close();
            return lista;
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Listar Pais");
        }
        return null;
	}
	//Provincia
	@SuppressWarnings("unchecked")
	public List<Entity_Provincia> listarProvincias(String pais){
        try{
        	Session session = sf.openSession();
        	List<Entity_Provincia> lista = session.createQuery("from Entity_Provincia p where p.pais.pais = :pais").setParameter("pais", pais).list();
    		session.close();
            return lista;

        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Listar Provincias");
        }
        return null;
	}
	//Roles
	@SuppressWarnings("unchecked")
	public List<Entity_Rol> listarRoles(){
        try{
        	Session session = sf.openSession();
        	List<Entity_Rol> lista = session.createQuery("from Entity_Rol ").list();
    		session.close();
            return lista;
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Listar Roles");
        }
        return null;
	}
	//Empleados
	@SuppressWarnings("unchecked")
	public List<Entity_Empleado> listarEmpleados(){
        try{
        	Session session = sf.openSession();
        	List<Entity_Empleado> lista = session.createQuery("from Entity_Empleado").list();
    		session.close();
            return lista;
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Listar empleados");
        }
        return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_Empleado> listarEmpleados(Integer idSucursal){
        try{
        	Session session = sf.openSession();
        	List<Entity_Empleado> lista = session.createQuery("select e from Entity_Empleado e where e.sucursal.id=:id").setParameter("id", idSucursal).list();
    		session.close();
            return lista;
        }catch(Exception e){
                System.out.println(e);
                System.out.println("ErrorDAO: AdministracionDAO: Listar empleados por Sucursal");
        }
        return null;
	}
	//Sucursales
	@SuppressWarnings("unchecked")
	public List<Entity_Sucursal> listarSucursales(){
	   try{
	      	Session session = sf.openSession();
	       	List<Entity_Sucursal> lista = session.createQuery("from Entity_Sucursal").list();
	  		session.close();
	        return lista;
	   }catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar sucursales");
	   }
	        return null;
	}
	//Stocks
	@SuppressWarnings("unchecked")
	public List<Entity_Stock> listarStock(){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_Stock> lista = session.createQuery("from Entity_Stock").list();
		  		session.close();
		        return lista;
			}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar stocks");
			}
			return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_Stock> listarStock(Integer idSucursal){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_Stock> lista = session.createQuery("select s from Entity_Stock s where s.sucursal.id=:id").setParameter("id", idSucursal).list();
		  		session.close();
		        return lista;
			}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar stocks por sucursal");
			}
			return null;
	}
	
	//Destino Nacional
	@SuppressWarnings("unchecked")
	public List<Entity_DestinoNacional> listarDestinoNacional(){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_DestinoNacional> lista = session.createQuery("from Entity_DestinoNacional").list();
		  		session.close();
		        return lista;
				}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar destino nacional ");
			}
			return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_DestinoNacional> listarDestinoNacional(Integer idSucursal){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_DestinoNacional> lista = session.createQuery("select s from Entity_DestinoNacional d where  d.sucursalOrigen.id = :id").setParameter("id", idSucursal).list();
		  		session.close();
		        return lista;
			}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar destino nacional por sucursal");
			}
			return null;
	}
	//Destino Internacional
	@SuppressWarnings("unchecked")
	public List<Entity_DestinoInternacional> listarDestinoInternacional(){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_DestinoInternacional> lista = session.createQuery("from Entity_DestinoInternacional").list();
		  		session.close();
		        return lista;
			}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar destino internacional ");
			}
			return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_DestinoInternacional> listarDestinoInternacional(Integer idSucursal){
			try{
		      	Session session = sf.openSession();
		       	List<Entity_DestinoInternacional> lista = session.createQuery("select s from Entity_DestinoInternacional d where  d.sucursalOrigen.id = :id").setParameter("id", idSucursal).list();
		  		session.close();
		        return lista;
			}catch(Exception e){
		        System.out.println(e);
		        System.out.println("ErrorDAO: AdministracionDAO: Listar destino internacional por sucursal");
			}
			return null;
	}
	//Usuario
	@SuppressWarnings("unchecked")
	public List<Entity_Usuario> listarUsuarios(){
			try{
			    Session session = sf.openSession();
			    List<Entity_Usuario> lista = session.createQuery("from Entity_Usuario").list();
			  	session.close();
			    return lista;
			}catch(Exception e){
			    System.out.println(e);
			    System.out.println("ErrorDAO: AdministracionDAO: Listar usuario ");
			}
			return null;
	}

	
	//Aux
	public Entity_Rol getRol(Integer id){
        try {
        	Session session=sf.openSession();
            session.beginTransaction();
            Entity_Rol rol = (Entity_Rol) session.get(Entity_Rol.class, id);
            session.getTransaction().commit();
            session.close();
            return rol;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error AdministracionDAO. Get rol");
        }
        return null;
	}

}
